import java.io.*;
import java.net.*;
import java.util.*;

/**
 * @author Jan Ove Kjærland (jkj092)
 * @author Martine Trulsrud (mtr086)
 * @since 2014-02-14
 */
public class SimbaClient {
	public static void main(String[] args) throws IOException {

		// Oppretter en socket
		DatagramSocket socket = new DatagramSocket();

		socket.setSoTimeout(5000);

		// Lar brukeren skrive inn navn på filen det skal leses fra
		Scanner scan = new Scanner(System.in);
		System.out.println("Skriv inn navn på tekstfil (med endelse):");
		String filename = scan.nextLine();

		sendPackets(socket, filename);
		receivePacket(socket, filename);

		socket.close();
	}

	private static void receivePacket(DatagramSocket s, String filename)
			throws IOException {

		byte[] buf = new byte[256];
		DatagramPacket packet = new DatagramPacket(buf, buf.length);
		try {
			s.receive(packet);
		} catch (SocketTimeoutException e) {
			System.out
					.println("Har ikke motatt svar siden 5 sekunder. Starter sending på nytt.");
			sendPackets(s, filename);
		}

		// Tolker svaret fra serveren
		String received = new String(packet.getData(), 0, packet.getLength());
		if (received.equals("OK")) {
			System.out.println("Overføring og lagring til server gikk fint.");
		} else if (received.equals("NOTOK")) {
			System.out.println("Noe gikk galt.");
		}
	}

	/**
	 * Leser fra tekstfilen og sender linje for linje i datagrampakker.
	 * 
	 * @param s
	 *            Socketen som brukes for sending
	 * @param filename
	 *            navnet på filen det leses fra
	 * @throws IOException
	 */
	private static void sendPackets(DatagramSocket s, String filename)
			throws IOException {

		// Skilletegn mellom de forskjellige feltene i headeren
		final String SPLIT = "|";

		// To lesere, slik at filen kan leses to ganger.
		BufferedReader in = null;
		BufferedReader in2 = null;
		try {
			in = new BufferedReader(new FileReader(filename));
			in2 = new BufferedReader(new FileReader(filename));
		} catch (FileNotFoundException e) {
			System.err.println("Fant ikke filen: " + filename);
		}

		// Finner antall linjer i tekstfilen
		int N = 0;
		while (in.readLine() != null) {
			N++;
		}

		// Finner adressen til serveren (som i dette tilfellet er på samme
		// maskin)
		InetAddress address = InetAddress.getLocalHost();
		DatagramPacket packet = null;

		byte[] buf = new byte[256];
		String line = null;

		// Hver linje i tekstfilen får en header og sendes til serveren.
		for (int L = 1; L <= N; L++) {
			line = in2.readLine();
			String header = "PUT" + SPLIT + "text.txt" + SPLIT + N + SPLIT + L
					+ SPLIT + line;
			buf = header.getBytes();
			packet = new DatagramPacket(buf, buf.length, address, 4445);
			s.send(packet);
		}
	}
}